package estrategias;

import java.util.Date;
import java.util.Vector;

import juegos.*;

/**
 * 
 * @author DaNieLooP
 *
 */
public class EscaladaMaxima implements Estrategia {

	/**
	 * metodo que resuelve un problema por escalada maxima.
	 * @param inicial nodo inicial
	 * @param nFinal nodo final
	 * @return nodo al que llegamos
	 */
	public Nodo resuelve(Nodo inicial,Nodo nFinal) {
		int generados = 1;
		int expandidos = 0;
		Date inicio = new Date();
		boolean enc = false;
		Vector v=new Vector(0,1);
		int i;
		boolean encint = false;
		Nodo actual;
		if(inicial.esFinal()){
			return inicial;
		}else{
			actual = inicial;
		}
		v.add(inicial);
		while(!v.isEmpty()&&!enc){
			expandidos++;
			encint = false;
			i=0;
			v.removeAllElements();
			v = actual.generaHijos();
			generados = generados + v.size();
			for(i=0;i<v.size();i++){
				if(((Nodo)v.elementAt(i)).getVHeur()<actual.getVHeur()){
					encint=true;
					actual=(Nodo)v.elementAt(i);
				}
			}
			if(!encint){
				return null;
			}
			if(actual.esFinal()){
				enc = true;
				Date fin = new Date();
				float total = (fin.getTime()-inicio.getTime())/1000f;
				String saux = actual.getCamino()+'\n'+"Nodos generados: "+generados+'\n'+"Nodos expandidos: "+expandidos+
				'\n'+"Tiempo transcurrido: "+total+" segundos"+'\n'+"Profundidad: "+actual.getProfundidad()+'\n'+"Coste: "+actual.getCoste();
				actual.setCamino(saux);
			}
		}
		return actual;
	}
	/**
	 * main para probar la estrategia
	 * @param args
	 */
	public static void main(String[] args) {
		NodoColores n = new NodoColores();
		EscaladaMaxima p = new EscaladaMaxima();
		NodoColores re = (NodoColores) p.resuelve(n,n);
		if(re==null){
			System.out.println("no hay solucion");
		}else{
			System.out.println(re.getCamino());
		}
	}

}
